#include <stdlib.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include "convertVideoToJpg.h"
#include "log/log.h"
#include "convertMp4ToFlv.h"
#include "convertVideoToBmp.h"

int main(int argc, char *argv[])
{
    const char *inputVideoFileName = "/home/alexander/CLionProjects/FFmpegLogTest/buck-2s.mp4";
    const char *inputAudioFileName = "/home/alexander/CLionProjects/FFmpegLogTest/buck-2s.flv";
//    const char *outputFileName = "/home/alexander/CLionProjects/FFmpegLogTest/buck_Bmp/buck-%3d.jpg";
    const char *outputFileName = "/home/alexander/CLionProjects/FFmpegLogTest/buck_Bmp/buck";

    int ret = convertVideoToJpg(inputVideoFileName, outputFileName);
    logInfo("Return Code is %d", ret);
}

//int main222(int argc, char *argv[])
//{
//    AVFormatContext *outputAVFormatContext;
//    AVOutputFormat *avOutputFormat;
//    AVStream *outputAVStream;
//    AVCodecContext *outputAVCodecContext;
//    AVCodec *outputAVCodec;
//
//    uint8_t *pictureBuffer;
//    AVFrame *picture;
//    int size;
//    AVPacket avPacket;
//    int yuv_size;
//    int got_picture = 0;
//    int returnCode;
//    FILE *inputFile = NULL;
//    int input_width = 640, input_height = 360;
//    const char *outputFileName = "/home/alexander/CLionProjects/FFmpegLogTest/buck_001.jpg";
//    inputFile = fopen("/home/alexander/CLionProjects/FFmpegLogTest/buck_001.yuv", "rb");
//
//    av_register_all();
//    outputAVFormatContext = avformat_alloc_context();
//    avOutputFormat = av_guess_format("mjpeg", NULL, NULL);
//    outputAVFormatContext->oformat = avOutputFormat;
//    returnCode = avio_open(&outputAVFormatContext->pb, outputFileName, AVIO_FLAG_READ_WRITE);
//    if(returnCode < 0)
//    {
//        printf("Could not open out file\n");
//        return -1;
//    }
//
//    outputAVStream = avformat_new_stream(outputAVFormatContext, 0);
//    if(outputFileName == NULL)
//    {
//        return -1;
//    }
//
//    outputAVCodecContext = outputAVStream->codec;
//    outputAVCodecContext->codec_id = avOutputFormat->video_codec;
//    outputAVCodecContext->codec_type = AVMEDIA_TYPE_VIDEO;
//    outputAVCodecContext->pix_fmt = AV_PIX_FMT_YUVJ420P;
//    outputAVCodecContext->width = input_width;
//    outputAVCodecContext->height = input_height;
//    outputAVCodecContext->time_base.num = 1;
//    outputAVCodecContext->time_base.den = 25;
//
//    av_dump_format(outputAVFormatContext, 0, outputFileName, 1);
//
//    outputAVCodec = avcodec_find_encoder(outputAVCodecContext->codec_id);
//    if(!outputAVCodec)
//    {
//        printf("Could not find encoder\n");
//        return -1;
//    }
//
//    returnCode = avcodec_open2(outputAVCodecContext, outputAVCodec, NULL);
//    if(returnCode < 0)
//    {
//        printf("Failed to open codec\n");
//        return -1;
//    }
//
//    picture = av_frame_alloc();
//    size = avpicture_get_size(outputAVCodecContext->pix_fmt, outputAVCodecContext->width, outputAVCodecContext->height);
//    pictureBuffer = (uint8_t *)av_malloc(size);
//    if(!pictureBuffer)
//    {
//        return -1;
//    }
//
//    avpicture_fill((AVPicture *)picture, pictureBuffer, outputAVCodecContext->pix_fmt, outputAVCodecContext->width, outputAVCodecContext->height);
//
//      returnCode = avformat_write_header(outputAVFormatContext, NULL);
//      if(returnCode < 0)
//      {
//          printf("Write header error!");
//      }
//
//    yuv_size = outputAVCodecContext->width * outputAVCodecContext->height;
//    av_new_packet(&avPacket, yuv_size * 3);
//    //Read YUV
//    returnCode = fread(pictureBuffer, 1, yuv_size * 3 / 2, inputFile);
//    if(returnCode < 0)
//    {
//        printf("Could not read input file(yuv_file)\n");
//        return -1;
//    }
//
//    //Y
//    picture->data[0] = pictureBuffer;
//    //U
//    picture->data[1] = pictureBuffer + yuv_size;
//    //V
//    picture->data[2] = pictureBuffer + yuv_size * 5 / 4;
//
//    /**适用把AVFrame编码成avPacket*/
//    returnCode = avcodec_encode_video2(outputAVCodecContext, &avPacket, picture, &got_picture);
//    if(returnCode < 0)
//    {
//        printf("Encode Error");
//        return -1;
//    }
//
//    if(got_picture == 1)
//    {
////        avPacket.stream_index = outputAVStream->index;
//        returnCode = av_write_frame(outputAVFormatContext, &avPacket);
//        if(returnCode < 0)
//        {
//            printf("Write frame error\n");
//        }
//    }
//
//    av_write_trailer(outputAVFormatContext);
//    av_packet_unref(&avPacket);
//
//    printf("Encode successful!\n");
//
//    if(outputAVStream)
//    {
//        avcodec_close(outputAVCodecContext);
//        av_frame_free(&picture);
//        av_free(pictureBuffer);
//    }
//
//    avio_close(outputAVFormatContext->pb);
//    avformat_free_context(outputAVFormatContext);
//
//    fclose(inputFile);
//
//    return 0;
//}




